<?php

namespace App\controller;

use support\Redis;
use support\Request;
use think\facade\Db;
use Illuminate\Support\Env;

class StoreOrderApi
{
    public function test()
    {
        // 314753846876442625
//        $find = Db::name('user')->where('id', 314753846876442625)->field('id,mobile,is_redis')->find();
//
//        var_dump($find);
//
//        return json(['code' => 1, 'msg' => '测试']);

        $prefix = env('REDIS_PREFIX');

        $key = $prefix . 'sales';

        Redis::watch($key); // 乐观锁 监视作用 set() 初始值0
        $sales = Redis::get($key);

        $n = 1000;
        if ($sales >= $n) {
            return json(['code' => 0, 'msg' => '秒杀结束']);
        }

        // 开启事务
        Redis::multi();
        Redis::incr($key); // 将 key 中 储存的数字值增一，如果key不存在，那么key的值会先被初始化为0，然后再执行 incr操作
        $res = Redis::exec(); // 成功1 失败0

        var_dump($res); //
//        array(1) {
//          [0]=> int(1)
//        }

        if (isset($res[0]) && $res[0] >= 0) {
            // 秒杀成功

            // 执行sql
            Db::name('user')->where('id', 314753846876442625)->inc('score')->update();


            return json(['code' => 1, 'msg' => '抢购成功']);
        } else {

            return json(['code' => 0, 'msg' => '抢购失败']);
        }
    }


    public function ts()
    {
        $res = Redis::get('fltest_goods_id_10');
        var_dump($res);
        return json(['code' => 1, 'msg' => '测试']);
    }


    // 分布式锁
    public function createOrder(Request $request)
    {
        $expire = 10; // 有效期 10秒
        $key = 'lock'; // key
        $value = time() + $expire; // 锁的值 = unix 时间戳 + 锁的有效期
        $status = true; // 如果 status 一直是true  则 一直在循环
        while ($status) {
            $lock = Redis::setNx($key, $value); // 只能是一个线程 会 变为 true
            if (empty($lock)) {
                usleep(10);
                $value = Redis::get($key);
                if ($value < time()) {
                    Redis::del($key);
                }
            } else {
                $status = false;
                // 执行业务逻辑，下步操作.....

            }
        }

    }

    // redis 乐观锁
    public function createOrder2(Request $request)
    {
        Redis::watch('sales'); // 乐观锁 监视作用 set() 初始值0
        $sales = Redis::get('sales');

        $n = 100;
        if ($sales >= $n) {
            return json(['code' => 0, 'msg' => '秒杀结束']);
        }

        // 开启事务
        Redis::multi();
        Redis::incr('sales'); // 将 key 中 储存的数字值增一，如果key不存在，那么key的值会先被初始化为0，然后再执行 incr操作
        $res = Redis::exec(); // 成功1 失败0

//        var_dump($res); //
//        array(1) {
//          [0]=> int(1)
//        }

        if (isset($res[0]) && $res[0] >= 0) {
            // 秒杀成功

            // 执行sql


            return json(['code' => 1, 'msg' => '抢购成功']);
        } else {

            return json(['code' => 0, 'msg' => '抢购失败']);
        }

//        if ($res) {
//            // 秒杀成功
//
//            // 执行sql
//
//            return json(['code' => 1, 'msg' => '抢购成功']);
//        } else {
//            return json(['code' => 0, 'msg' => '抢购失败']);
//        }

    }

    // nginx漏桶限流
    // nginx+lua拓展+redis 【watch+事务】实现乐观锁


}
